#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: xjx
@time: 2023/11/7 20:58 
@file: driving_behavior_test.py
@project: nanchangproject
@describe: TODO
"""
# def find_interesting_site():
#     # 数据筛选步骤
#     # 1.筛选停车点
#     # 2.聚类，去除离群点
#     # 3.统计每一个聚类的月内时间分布，若仅出现一两天，则意义不大，删去，若每天都有，则值得关注
#     # 4.统计每一个聚类的日内时间分布，其中20：00-06：00的分布点应为居住点，而我们关心的是工作地点，因此应当筛选出06：00-20：00时间段内的停车点
#     # 5.根据剩余的有效停车点，对每一个聚类计算其地理中心
#     # 6.根据地理中心的POI数据筛选有价值的行业信息
#     df_re = pd.read_csv(r'./29573.0-39573.0公里-1.csv', low_memory=False)  # 读取csv文件
#     df1 = df_re[['采集时间', '经度', '纬度', '发动机状态']].copy()  # 提取四个维度的信息
#     df1 = df1.dropna(axis=0, how='all')  # 去除采集时间空值的数据
#     df1['采集时间'] = pd.PeriodIndex(df1['采集时间'], freq="S")
#     # 以固定的频率（如天、月、季度、年等）对时间进行切分和对齐，使得在处理时间序列数据时更加高效和方便
#     df1['发动机状态'].fillna(method='ffill', inplace=True)  # 用前一个非缺失值填补当前值
#     df1 = df1[df1['纬度'] > 0]  # 排除异常值
#     levelmap = {"启动": 1, "关闭": 0}  # 对启动状态进行编码
#     df1['发动机状态'] = df1['发动机状态'].map(levelmap)
#     stop_p = df1[df1['发动机状态'] == 0].copy()  # 筛选停车点
#     data_p = stop_p[['纬度', '经度']].values  # 筛选停车点经纬度,一个文件大概4万多行
#     kms_per_radian = 6371.0088
#     epsilon = 0.5 / kms_per_radian  # 聚类半径
#     dbscan1 = DBSCAN(eps=epsilon, min_samples=200, algorithm='ball_tree', metric='haversine')
#     result = dbscan1.fit_predict(data_p)  # 聚类结果
#     cluster_label = dbscan1.labels_  # labels出现-1代表离群点
#     cluster_num = len(np.unique(cluster_label))  # 计算共有多少种标签
#     stop_p['label'] = cluster_label  # 聚类标签写入df中
#     a = stop_p['采集时间'].copy()
#     t = a.map(lambda x: x.hour)
#     stop_p['采集小时'] = t  # 筛选小时分布数据
#
#     # 工作地点的停车点应该每天或接近每天都有分布，统计分布的天数若超过总天数的90%认为是大概率的工作地点
#     cluster_list = []
#     cluster_list_every_num = []
#     for i in range(cluster_num - 1):  # -1是为了去除聚类-1，即离群点
#         # 共有23个聚类，这里相当于已经删除了离群点（-1）了
#         cluster_list.append(stop_p[stop_p['label'] == i])
#     for clu in cluster_list:
#         # 对每一个聚类进行天数分布统计
#         cluster_list_every_num.append(len(clu['采集时间'].groupby([clu['采集时间'].dt.month, clu['采集时间'].dt.day]).agg('count')))
#
#     tl = cluster_list_every_num.copy()
#     result_tl = []
#     max_tl = max(tl)
#     for i in tl:
#         # 设置阈值0.3，即大于最大分布天数的0.3倍的聚类才被划分为有效聚类
#         if i > 0.3 * max_tl:
#             result_tl.append(tl.index(i))
#     # print(result_tl)
#     max_day = stop_p['采集时间'].max()
#     min_day = stop_p['采集时间'].min()
#     max_day_len = (max_day - min_day) / pd.Timedelta(1, 'D')  # 总数据的时间跨度，即采集了多少天
#     # 若最大分布天数仍然小于总天数的10%，则聚类无效
#     if max_tl < 0.1 * max_day_len:
#         return None
#     # print(max_day, min_day, max_day_len)
#
#     interesting_site_list = []
#     for num in result_tl:
#         # num表示的是有效的聚类的标签
#         interest_clu = stop_p[stop_p['label'] == num]  # 取聚类num的数据
#         # interest_clu['采集小时'].hist()
#         # plt.show() # 绘制时间分布直方图
#         # 筛选6：00至20：00的停车数据作为分析对象
#         interest_clu = interest_clu[(interest_clu['采集小时'] < 20) & (interest_clu['采集小时'] > 6)]
#         clu_data = interest_clu[['经度', '纬度']].values
#         kmeans = KMeans(n_clusters=1, n_init='auto')  # 采用单一聚类寻找聚类中心
#         kmeans.fit(clu_data)
#         interesting_site_list.append(kmeans.cluster_centers_[0])  # 由于只有一个聚类中心，因此取第0个，顺序为先经度后纬度
#
#     return interesting_site_list
